//package com.nbufe.service;
//
//import com.nbufe.utils.FormatUtil;
//import org.apache.commons.math3.analysis.ParametricUnivariateFunction;
//import org.apache.commons.math3.fitting.PolynomialCurveFitter;
//import org.apache.commons.math3.fitting.SimpleCurveFitter;
//import org.apache.commons.math3.fitting.WeightedObservedPoints;
//import org.apache.commons.math3.fitting.leastsquares.LeastSquaresBuilder;
//import org.apache.commons.math3.fitting.leastsquares.LeastSquaresOptimizer;
//import org.apache.commons.math3.fitting.leastsquares.MultivariateJacobianFunction;
//import org.apache.commons.math3.linear.*;
//
//import java.time.LocalDate;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
//import org.apache.commons.math3.analysis.function.Exp;
//import org.apache.commons.math3.fitting.SimpleCurveFitter;
//import org.apache.commons.math3.fitting.WeightedObservedPoints;
//import org.apache.commons.math3.optim.SimpleValueChecker;
//import org.apache.commons.math3.optim.nonlinear.vector.jacobian.LevenbergMarquardtOptimizer;
//import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
//
//import java.util.Arrays;
//
//
///**
// * @Author luzhiheng
// * @Date 2024/1/18 10:54
// */
//public interface CarbonPrediction {
//
//    /**
//     * 二次平滑指数碳排放预测
//     *
//     * @param data
//     * @param alpha
//     * @return
//     */
//    static Double twiceExponentialSmoothing(List<Double> data, double alpha) {
//        double forecast = data.get(0);  // 初始化第一个预测值为第一个观测值
//
//        for (int t = 1; t < data.size(); t++) {
//            forecast = alpha * data.get(t) + (1 - alpha) * forecast;
//        }
//
//        for (int t = 1; t < data.size(); t++) {
//            forecast = alpha * data.get(t) + (1 - alpha) * forecast;
//        }
//        return FormatUtil.saveTwoDecimalPlace(forecast);
//    }
//
//    static void main(String[] args) {
//        // 示例数据
////        double[] carbonEmissions = {1000, 2000, 2031, 1099, 1981, 1501, 3014, 1768, 1929, 8899, 10000, 500, 3998, 2900, 999};
//        List<Double> carbonEmissions = new ArrayList<>();
//        carbonEmissions.add(1000.0);
//        carbonEmissions.add(2000.0);
//        carbonEmissions.add(2031.0);
//        carbonEmissions.add(2031.0);
//        carbonEmissions.add(1099.0);
//        carbonEmissions.add(1981.0);
//        carbonEmissions.add(1501.0);
//        carbonEmissions.add(3014.0);
//        carbonEmissions.add(2014.0);
//        carbonEmissions.add(1014.0);
//        carbonEmissions.add(914.0);
//        carbonEmissions.add(814.0);
//        carbonEmissions.add(714.0);
//        carbonEmissions.add(614.0);
//        carbonEmissions.add(514.0);
//        carbonEmissions.add(414.0);
//        carbonEmissions.add(882.85);
//        carbonEmissions.add(882.83);
//        carbonEmissions.add(882.81);
//        carbonEmissions.add(882.8);
//        carbonEmissions.add(882.8);
//
//        // 设置平滑系数
//        double alpha = 0.2;
//
//        // 使用简单指数平滑进行预测
//        List<Double> forecastValues = new ArrayList<>();
//
//        // 预测未来5年的数据
//        for (int i = 0; i < 5; i++) {
//            forecastValues.add(twiceExponentialSmoothing(carbonEmissions, alpha));
//            carbonEmissions.add(forecastValues.get(i));
//        }
//
//        // 输出预测结果
//        System.out.println("未来5年碳排放预测结果:");
//        for (int i = 0; i < 5; i++) {
//            System.out.println((2027 + i) + "年预测值: " + forecastValues.get(i));
//        }
//    }
//}
//
///**
// * 二次平滑法
// */
//class DoubleExponentialSmoothing {
//
//    public static double[] doubleExponentialSmoothing(double[] data, int m, double alpha, double beta) {
//        int n = data.length;
//
//        // 初始化水平和趋势
//        double[] level = Arrays.copyOf(data, n + m);
//        double[] trend = new double[n + m];
//
//        trend[0] = (data[1] - data[0]) / 2;
//
//        // 计算水平和趋势
//        for (int i = 1; i < n; i++) {
//            level[i] = alpha * data[i] + (1 - alpha) * (level[i - 1] + trend[i - 1]);
//            trend[i] = beta * (level[i] - level[i - 1]) + (1 - beta) * trend[i - 1];
//        }
//
//        // 预测未来m个数据点
//        for (int i = n; i < n + m; i++) {
//            level[i] = level[i - 1] + trend[i - 1];
//            trend[i] = beta * (level[i] - level[i - 1]) + (1 - beta) * trend[i - 1];
//            level[i] += trend[i];
//        }
//
//        // 返回包含原始数据和预测值的数组
//        return level;
//    }
//
//    public static void main(String[] args) {
//        // 示例数据
//        double[] carbonEmissions = {1000, 2000, 2031, 1099, 1981, 1501, 3014, 1768};
//
//        // 设置平滑系数
//        double alpha = 0.2;
//        double beta = 0.2;
//
//        // 预测未来5年的数据
//        int futureYears = 5;
//        double[] forecastValues = doubleExponentialSmoothing(Arrays.copyOf(carbonEmissions, carbonEmissions.length + futureYears), futureYears, alpha, beta);
//
//        // 输出预测结果
//        System.out.println("未来5年碳排放预测结果:");
//        for (int i = 1; i <= 5; i++) {
//            System.out.println("202" + (5 + i) + "年预测值: " + forecastValues[i]);
//        }
//    }
//}
//
///**
// * 基于自回归预测法的碳排放预测
// */
//class AutoRegressionPrediction {
//
//    public static double[] autoRegressionPrediction(double[] data, int m, int order) {
//        int n = data.length;
//
//        // 构建观测点
//        WeightedObservedPoints obs = new WeightedObservedPoints();
//        for (int i = 0; i < n; i++) {
//            obs.add(i, data[i]);
//        }
//
//        // 拟合多项式曲线
//        PolynomialCurveFitter fitter = PolynomialCurveFitter.create(order);
//        double[] coefficients = fitter.fit(obs.toList());
//
//        // 预测未来m个数据点
//        double[] forecastValues = new double[m];
//        for (int i = 0; i < m; i++) {
//            double forecast = 0;
//            for (int j = 0; j < coefficients.length; j++) {
//                forecast += coefficients[j] * Math.pow(n + i, j);
//            }
//            forecastValues[i] = forecast;
//        }
//
//        return forecastValues;
//    }
//
//    public static void main(String[] args) {
//        // 示例数据
//        double[] carbonEmissions = {1000, 2000, 2031, 1099, 1981, 1501, 3014, 1768};
//
//        // 设置自回归模型阶数
//        int order = 2;
//
//        // 预测未来5年的数据
//        int futureYears = 5;
//        double[] forecastValues = autoRegressionPrediction(carbonEmissions, futureYears, order);
//
//        // 输出预测结果
//        System.out.println("未来5年碳排放预测结果:");
//        for (int i = 0; i < futureYears; i++) {
//            System.out.println("202" + (5 + i) + "年预测值: " + forecastValues[i]);
//        }
//    }
//}
//
///**
// * 基于差分整合移动平均自回归模型的碳排放预测
// */
//class ARIMAPrediction {
//
//    public static double[] arimaPrediction(double[] data, int m, int order) {
//        int n = data.length;
//
//        // 构建观测点
//        WeightedObservedPoints obs = new WeightedObservedPoints();
//        for (int i = 0; i < n; i++) {
//            obs.add(i, data[i]);
//        }
//
//        // 拟合多项式曲线
//        PolynomialCurveFitter fitter = PolynomialCurveFitter.create(order);
//        double[] coefficients = fitter.fit(obs.toList());
//
//        // 预测未来 m 个数据点
//        double[] forecastValues = new double[m];
//        for (int i = 0; i < m; i++) {
//            double forecast = 0;
//            for (int j = 0; j < coefficients.length; j++) {
//                forecast += coefficients[j] * Math.pow(n + i, j);
//            }
//            forecastValues[i] = forecast;
//        }
//
//        return forecastValues;
//    }
//
//    public static void main(String[] args) {
//        // 示例数据
//        double[] carbonEmissions = {1000, 2000, 2031, 1099, 1981, 1501, 3014, 1768};
//
//        // 设置 ARIMA 模型阶数
//        int order = 2;
//
//        // 预测未来 5 年的数据
//        int futureYears = 5;
//        double[] forecastValues = arimaPrediction(carbonEmissions, futureYears, order);
//
//        // 输出预测结果
//        System.out.println("未来 5 年碳排放预测结果:");
//        for (int i = 0; i < futureYears; i++) {
//            System.out.println("202" + (5 + i) + "年预测值: " + forecastValues[i]);
//        }
//    }
//}
//
//
//
//class ARIMAPrediction1 {
//
//    public static double[] arimaPrediction(double[] data, int m, int order) {
//        int n = data.length;
//
//        // 使用ARIMA模型进行预测
//        ARIMAFitter arimaFitter = new ARIMAFitter();
//        double[] forecastValues = arimaFitter.fitARIMA(data, m, order);
//
//        return forecastValues;
//    }
//
//    public static void main(String[] args) {
//        // 示例数据
//        double[] carbonEmissions = {1000, 2000, 2031, 1099, 1981, 1501, 3014, 1768, 9900,1002,3811,9222};
//
//        // 设置 ARIMA 模型阶数
//        int order = 2;
//
//        // 预测未来 5 年的数据
//        int futureYears = 5;
//        double[] forecastValues = arimaPrediction(carbonEmissions, futureYears, order);
//
//        // 输出预测结果
//        System.out.println("未来 5 年碳排放预测结果:");
//        for (int i = 0; i < futureYears; i++) {
//            System.out.println("202" + (5 + i) + "年预测值: " + forecastValues[i]);
//        }
//    }
//}
//
//class ARIMAFitter {
//    public double[] fitARIMA(double[] data, int numYears, int order) {
//        // 使用简单线性回归拟合ARIMA模型的参数
//        double[] coefficients = fitLinearRegression(data, order);
//
//        // 预测未来 numYears 年的数据
//        double[] forecastValues = new double[numYears];
//        for (int i = 0; i < numYears; i++) {
//            double forecast = 0;
//            for (int j = 0; j < coefficients.length; j++) {
//                forecast += coefficients[j] * Math.pow(data.length + i, j);
//            }
//            forecastValues[i] = forecast;
//        }
//
//        return forecastValues;
//    }
//
//    private double[] fitLinearRegression(double[] data, int order) {
//        int n = data.length;
//        double[] xValues = new double[n];
//        for (int i = 0; i < n; i++) {
//            xValues[i] = i;
//        }
//
//        // 构建观测点
//        WeightedObservedPoints obs = new WeightedObservedPoints();
//        for (int i = 0; i < n; i++) {
//            obs.add(xValues[i], data[i]);
//        }
//
//        // 使用最小二乘法拟合多项式曲线
//        PolynomialCurveFitter fitter = PolynomialCurveFitter.create(order);
//        double[] coefficients = fitter.fit(obs.toList());
//
//        return coefficients;
//    }
//}